package com.ygqh.baby.service;

import com.ygqh.baby.ao.*;
import com.ygqh.baby.exception.YgException;
import com.ygqh.baby.model.*;
import com.ygqh.baby.po.YgReturnOrder;
import com.ygqh.baby.po.YgReturnOrderDetail;
import com.ygqh.baby.po.YgSupplier;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface YgReturnOrderService {

	List<YgReturnOrder> find(Long... orderIds);

	int findCount();

	YgReturnOrder findById(Long id);

	int deleteSoft(Long[] ids);

	int deleteSoft(Long id);

	int save(YgReturnOrder ygReturnOrder);

	int update(YgReturnOrder ygReturnOrder);

	int saveOrUpdate(YgReturnOrder ygReturnOrder);

	/**
	 * 运营系统退换货管理 列表页
	 *
	 * @param queryInfo
	 * @param q
	 * @param telPhone     手机号
	 * @param returnType   退换货类型 Change 换货 Return 退货
	 * @param returnCode   退换货单号
	 * @param startDate
	 * @param endDate
	 * @param id
	 * @param returnStatus 订单状态
	 * @param productName
	 * @return
	 */
	ResultSet<YgReturnOrder> search(QueryInfo queryInfo, String q, String username, ReturnType returnType, String returnCode, Date startDate, Date endDate,
									Long id, ReturnStatus returnStatus, String expressCode, String productName);

	/**
	 * 获取可退换货订单列表
	 *
	 * @param queryInfo
	 * @param userId
	 * @return
	 */
	@Deprecated
	List<YgOrderModel> findOrderListForReturn(QueryInfo queryInfo, Long userId);
	List<YgOrderModel> findOrderListForReturn(QueryInfo queryInfo, Long userId, String platformNo);

	/**
	 * 根据原订单号，获取退货单/换货单
	 *
	 * @param orderId
	 * @return
	 */
	List<YgReturnOrder> findRetrunByOrderId(Long orderId);

	YgOrderInfoModel findOrderInfo4Retrun(Long orderId, long userId);

	YgOrderInfoModel findOrderInfo4Retrun(Long orderId, Long userId, DataStatus status);

	/**
	 * 创建换货单
	 *
	 * @param exchangeOrder
	 * @param userId
	 * @return
	 * @throws Exception
	 */
	Message createExchangeOrder(YgExchangeOrder exchangeOrder, Long userId) throws Exception;

	/**
	 * 获取需退回金额
	 *
	 * @param modelList
	 * @return
	 */
	Message getReturnPrice(YgReturnInfoModel modelList);

	/**
	 * 保存退货单
	 *
	 * @param infoModel
	 * @param returnReason
	 * @param imgPaths
	 * @param info
	 * @param userId
	 * @return
	 */
	Message saveReturnOrder(YgReturnInfoModel infoModel, ReturnReasonType returnReasonType, String returnReason,
							String imgPaths, YgReturnInfoModel info, Long userId);

	/**
	 * 退换货自动审核通过
	 *
	 * @param returnCode
	 * @param handler    操作人
	 * @param remark     备注
	 * @return Message 返回类型
	 * @throws @date 2017年7月25日 上午11:44:45
	 * @Title: autoAuditReturnOrder
	 * @author （guohao）
	 * @version V1.0
	 */
	Message autoAuditReturnOrder(String returnCode, String handler, String remark, Boolean pass);

	/**
	 * 取消退换货订单
	 *
	 * @param id     是否归还库存
	 * @param userId
	 * @return
	 */
	Message cancelReturnOrder(Long id, Long userId);

	YgReturnOrder findDetailById(Long id);

	YgReturnOrder findByReturnCode(String returnOrderId);

	/**
	 * 更新物流信息
	 *
	 * @param orderLogisticsModel
	 * @return
	 */
	Message updateLogistics(YgReturnOrderLogisticsModel orderLogisticsModel, Long userId);

	/**
	 * 退货详情页 --- 使用郭浩的
	 *
	 * @param id
	 * @return
	 */
	@Deprecated
	YgReturnOrder findReturnOrderDetail(Long id);

	/**
	 * 获取退换货详细
	 *
	 * @param returnCode
	 * @param userId
	 * @return
	 */
	YgReturnOrderInfoModel findReturnOrderInfo(String returnCode, Long userId);

	/**
	 * 审核退，换货单
	 *
	 * @param returnCode      退换货单号
	 * @param remark          审核意见
	 * @param userName        操作人
	 * @param passOrderReject 通过或驳回
	 * @param orderStatus     原订单此刻状态（旺店通实时状态，这里标记两种。代签收，未发货）
	 * @return
	 */
	Message auditReturnOrder(String returnCode, String remark, Long userId, String userName, Boolean passOrderReject, OrderStatus orderStatus);

	/**
	 * 退款确认
	 *
	 * @param serialNumber
	 * @return
	 */
	@Deprecated
	Message refund(Long returnOrderId, String serialNumber, String trueName);

	/**
	 * 原渠道自动退款
	 *
	 * @param returnOrderId      退货单id
	 * @param remark             备注
	 * @param handler            处理人
	 * @param refundPrice        实际退款金额
	 * @param refundAccountPrice 实际退款账户金额
	 * @param payType
	 * @return
	 * @throws YgException
	 */
	Message autoRefund(Long returnOrderId, String remark, String handler, BigDecimal refundPrice, BigDecimal refundAccountPrice) throws YgException;

	void applyRefundNew(String platformNo, PayType payType, AppType appType, String returnCode, String orderPayCode, BigDecimal refundPrice,
						BigDecimal totalPrice, String handler);

	/**
	 * 填写入库单
	 *
	 * @param returnOrderDetail
	 * @return
	 */
	Message saveStockInOrder(List<YgReturnOrderDetail> returnOrderDetail, String trueName);

	/**
	 * 查询退换货单列表
	 *
	 * @param queryInfo
	 * @param userId
	 * @return
	 */
	@Deprecated
	List<YgReturnOrderModel> findReturnList(QueryInfo queryInfo, Long userId);
	List<YgReturnOrderModel> findReturnList(QueryInfo queryInfo, Long userId, String platformNo);

	/**
	 * 根据退货单号查询退货单（含退货详细）
	 *
	 * @param tradeNO2
	 * @return
	 */
	YgReturnOrder findDetailByReCode(String tradeNO2);

	/**
	 * @param limitDate 当前时间 - 7天
	 * @return
	 */
	List<YgReturnOrder> findOrderForComplete(Date limitDate);

	int returnOrderForCompleteTask(List<String> returnCodes);

	/**
	 * 换货发货
	 *
	 * @param returnCode
	 * @param expressCompany 快递公司名
	 * @param logisticsCode  快递公司编码
	 * @param expressCode    运单号
	 * @param send_count     发货种类
	 * @param createBy
	 * @return
	 */
	Message sendOutGoods(String returnCode, String expressCompany, String logisticsCode, String expressCode, Long send_count, String createBy);

	/**
	 * 获取5天未提交退货的申请单
	 *
	 * @param limitDate 当前时间 - 10天
	 * @return
	 */
	List<OrderReturnInfo> findReOrder4Cancel(Date limitDate);

	int updateReOrderForCancel(List<String> returnCodes);

	/**
	 * @param orderId
	 * @return returnAble true/可退，false/不可退; changeAble true/可换，false/不可换
	 */
	Map<String, Object> existenceReturnByOrderId(Long orderId);

	/**
	 * 目标订单指定明细是否存在退换
	 *
	 * @param orderId      订单编号
	 * @param sourceSkuIds 指定的需要退换的明细
	 * @return Message 返回类型</br>
	 * @throws @date 2017年8月4日 上午10:28:53
	 * @Title: existReturn
	 * @author （guohao）
	 * @version V1.0
	 */
	List<CheckReturnModel> existReturn(Long orderId, List<Long> sourceSkuIds);

	List<Map<String, Object>> getReturnOrderReport(Date startDate, Date endDate, String returnType, String productName);

	Message checkReturn(Long orderId, List<Long> sourceSkuIds, ReturnType returnType);

	/**
	 * 后台取消申请单
	 *
	 * @param returnCode
	 * @param remark
	 * @param userName
	 * @return
	 */
	Message cancelReturn(String returnCode, String remark, String userName);

	/**
	 * 根据订单号查询退换货单
	 *
	 * @param orderId
	 * @param returnType   可空
	 * @param returnStatus 可空
	 * @return
	 */
	List<YgReturnOrder> findByOrderId(Long orderId, ReturnType returnType, ReturnMode returnMode, ReturnStatus... returnStatus);

	YgReturnOrder findReturnOrderMoneryById(Long id);

	Message alipayRefundSuccess(String batchNo, String success_num, String result_details);

	YgReturnOrder findOtherReturn(Long orderId, String returnCode);

	/**
	 * ，全部退货将原订单取消（原订单待发货时）
	 *
	 * @param orderId 入参
	 * @return Message 返回类型
	 * @throws @date 2017年10月11日 下午5:50:24
	 * @Title: closeOrderByReturn
	 * @author （guohao）
	 * @version V1.0
	 */
	Message closeOrderByReturn(Long orderId, ReturnMode returnMode, String returnCode);

	/**
	 * 订单剩余退款金额(即还剩下多少钱未退，含线下,包含成长基金)
	 *
	 * @param orderId 入参
	 * @return Boolean 返回类型
	 * @throws @date 2017年10月11日 下午5:57:18
	 * @Title: isAllReturn
	 * @author （guohao）
	 * @version V1.0
	 */
	BigDecimal residualRefundPrice(Long orderId);

	BigDecimal residualRefundPriceOnlyPaid(Long orderId);

	/**
	 * 原订单还有多少商品未退货（这里已退数量指已完成的退货单数量）
	 *
	 * @param orderId 入参
	 * @return List<ResidualRefundSku> 返回类型
	 * @throws @date 2017年10月18日 下午5:30:23
	 * @Title: residualRefundSku
	 * @author （guohao）
	 * @version V1.0
	 */
	List<ResidualRefundSku> residualRefundSku(Long orderId);

	/**
	 * 订单是否全部退货（含线上，线下。且已完成的退货）
	 *
	 * @param orderId 入参
	 * @return Boolean 返回类型
	 * @throws @date 2017年10月18日 下午5:31:51
	 * @Title: isAllReturn
	 * @author （guohao）
	 * @version V1.0
	 */
	Boolean isAllReturn(Long orderId);

	Boolean isFirstReturnInStockByOrder(Long orderId, String returnCode);

	List<YgReturnOrder> findByReturnStatusHasDetail(Date startDate, Date endDate, String returnCode, ReturnType returnType, ReturnStatus... returnStatus);

	List<YgReturnOrder> findByReturnStatusHasDetail(Date startDate, Date endDate, String returnCode, ReturnType returnType, Long supplierId, ReturnStatus... returnStatus);

	YgSupplier findSupplierByReturnOrder(YgReturnOrder ygReturnOrder);

	Boolean isExitNotCompleteReturn(Long orderId, ReturnType returnType, ReturnMode returnMode);

	ResultSet<YgReturnOrder> searchReturnForAgent(QueryInfo queryInfo, Long supplierId, ReturnType returnType, String returnCode, Date startDate, Date endDate,
												  Long orderId, ReturnStatus returnStatus, String expressCode, String productName);

	List<Map<String, Object>> selectSendOrderBySupplier(Long supplierId, Date startDate, Date endDate);


	List<Map<String, Object>> selectReturnBySupplier(Long supplierId, Date startDate, Date endDate);

	List<Long> findOrderIdsByReturn(Date startDate, Date endDate, ReturnType returnType, ReturnStatus... returnStatus);

	/**
	 * 将原用户的退货单转移到目标用户下
	 *
	 * @param sourceUserId
	 * @param targetUserId
	 * @return int    返回类型
	 * @throws
	 * @Title: transferReturnOrder
	 * @author （guohao）
	 * @date 2018年5月10日 下午6:34:58
	 * @version V1.0
	 */
	int transferReturnOrder(Long sourceUserId, Long targetUserId);

	List<YgReturnOrder> findByOrderIdList(List<Long> orderIdList, ReturnType returnType);

	Boolean isExist(String returnCode, ReturnType change);

	int updateChangeSend(List<YgReturnOrder> changeList);

	List<YgReturnOrder> findByReturnStatusHasDetail(Date startDate, Date endDate, String returnCode,
													ReturnType returnType, Long supplierId, Boolean afterSales,
													ReturnReasonType returnReasonType, ReturnStatus... returnStatus);

	List<String> findExistsReturnCode(List<String> returnCodeList);

	/**
	 * 批量保存
	 *
	 * @param returnOrderList returnOrderList
	 */
	int saveReturnOrderList(List<YgReturnOrder> returnOrderList);

	/**
	 * 推送旺店通成功，修改旺店通外部单号
	 * @param returnCodeList
	 * @return
	 */
	int updateWdtOrderCode(List<String> returnCodeList);

	/**
	 * 根据单号修改状态
	 * @param updateOrderList
	 * @return
	 */
	int updateReturnStatusByReturnCode(List<YgReturnOrder> updateOrderList);

	/**
	 * 根据发货时间获取换货信息
	 * @param startDate
	 * @param endDate
	 * @param supplierId
	 * @return
	 */
	List<YgReturnOrder> findChangeDetailBySendTime(Date startDate, Date endDate, Long supplierId, Boolean afterSales);

	List<Map<String,Object>> findReturnedInfoBySupplier(Date startDate, Date endDate,Long supplierId,Boolean afterSales);

	List<YgReturnOrder> findDetailByReturnCodeList(List<String> returnCodeList);
}
